package com.example.reflect;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * ClassName:testUser
 * Package:com.example.reflect
 * Description:
 *
 * @Author:ZhangXin
 * @Create:2023/5/9-15:26
 * @Version:v1.0
 */

public class testUser {
    /**
     * 类名是：com.example.reflect.User
     * 该类中有String类型的name属性和int类型的age属性。
     * 另外你也知道该类的设计符合javabean规范。（也就是说属性私有化，对外提供setter和getter方法
     */
    @Test
    public void testUser() throws Exception {
        String className = "com.example.reflect.User";
        String propertyName = "age";

        //通过反射机制调用setAge(int)方法
        //获取类
        Class<?> aClass = Class.forName(className);
        //获取方法名
        String setMethodName = "set" + propertyName.toUpperCase().charAt(0) + propertyName.substring(1);
        //获取方法
        Method setMethod = aClass.getDeclaredMethod(setMethodName, int.class);
        //准备对象
        Constructor<?> constructor = aClass.getDeclaredConstructor();
        Object instance = constructor.newInstance();
        //调用方法
        setMethod.invoke(instance, 30);

        System.out.println(instance);
    }

    @Test
    public void testUser1() throws Exception {
        String className = "com.example.reflect.User";
        String propertyName = "age";

        //通过反射机制调用setAge(int)方法
        //获取类
        Class<?> aClass = Class.forName(className);
        //获取方法名
        String setMethodName = "set" + propertyName.toUpperCase().charAt(0) + propertyName.substring(1);
        //根据属性名获取属性类型
        Field field = aClass.getDeclaredField(propertyName);
        //获取方法
        Method setMethod = aClass.getDeclaredMethod(setMethodName, field.getType());
        //准备对象
        Constructor<?> constructor = aClass.getDeclaredConstructor();
        Object instance = constructor.newInstance();
        //调用方法
        setMethod.invoke(instance, 30);

        System.out.println(instance);
    }
}
